﻿CREATE TABLE pca_courier.manifiesto_consignados
(
	manifiesto_id bigint NOT NULL,
	consignado_id bigint NOT NULL,
	fecha_hora_regreso timestamp with time zone,
	tipo_descargo_id varchar(4),
	observaciones text,
	sesion_id bigint NOT NULL,--la sesion con la que se registra el consignado
	sesion_id_descargo bigint,--la sesion con la que se registra el descargo
	CONSTRAINT manifiesto_consignados_pk PRIMARY KEY(manifiesto_id,consignado_id),
	CONSTRAINT manifiesto_fkey FOREIGN KEY(manifiesto_id)
		REFERENCES pca_courier.manifiestos(manifiesto_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT consignados_fkey FOREIGN KEY(consignado_id)
		REFERENCES pca_courier.consignados(consignado_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT tipo_descargo_fkey FOREIGN KEY(tipo_descargo_id)
		REFERENCES pca_courier.tipo_descargo(tipo_descargo_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT sesiones_fkey FOREIGN KEY (sesion_id)
		REFERENCES pca_log.sesiones(sesion_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT sesiones_descargo_fkey FOREIGN KEY (sesion_id_descargo)
		REFERENCES pca_log.sesiones(sesion_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT
);

ALTER TABLE pca_courier.consignados ADD CONSTRAINT manifiestos_fkey FOREIGN KEY(manifiesto_id,consignado_id)
						REFERENCES pca_courier.manifiesto_consignados(manifiesto_id,consignado_id) MATCH SIMPLE
						ON UPDATE RESTRICT ON DELETE RESTRICT;

-----------------------------------------------------------------------------------------------
-----------------------------------------Triggers----------------------------------------------
-----------------------------------------------------------------------------------------------

--Actualiza el manifiesto asignado al consignado
CREATE OR REPLACE FUNCTION pca_courier.fn_update_consignado_manifiesto() RETURNS trigger AS
$$
BEGIN
	IF(TG_OP='INSERT')THEN
		UPDATE pca_courier.consignados SET
			manifiesto_id=NEW.manifiesto_id,
			numero_manifiestos=numero_manifiestos+1
		WHERE
			consignado_id=NEW.consignado_id;
		RETURN NULL;
	ELSIF(TG_OP='DELETE') THEN
		UPDATE pca_courier.consignados SET
			manifiesto_id=null,
			numero_manifiestos=numero_manifiestos-1
		WHERE
			consignado_id=OLD.consignado_id;
		RETURN NULL;
	END IF;
	RETURN NULL;
END;
$$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tri_update_consignado_manifiesto ON pca_courier.manifiesto_consignados;
CREATE TRIGGER tri_update_consignado_manifiesto AFTER INSERT OR DELETE ON pca_courier.manifiesto_consignados
FOR EACH ROW
EXECUTE PROCEDURE pca_courier.fn_update_consignado_manifiesto();

--Ingrementa el valor del campo registros en la tabla pca_courier.manifiestos
CREATE OR REPLACE FUNCTION pca_courier.fn_contador_manifiesto_consignados() RETURNS trigger AS
$$
BEGIN
	IF(TG_OP='INSERT')THEN
		UPDATE 
			pca_courier.manifiestos
		SET 
			registros=registros+1 
		WHERE 
			manifiesto_id = NEW.manifiesto_id;
	ELSIF(TG_OP='DELETE')THEN
		UPDATE 
			pca_courier.manifiestos 
		SET 
			registros=registros-1  
		WHERE 
			manifiesto_id = OLD.manifiesto_id;
	END IF;
	RETURN NULL;
END;
$$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tri_contador_manifiesto_consignados ON pca_courier.manifiesto_consignados;
CREATE TRIGGER tri_contador_manifiesto_consignados AFTER INSERT OR DELETE ON pca_courier.manifiesto_consignados
FOR EACH ROW
EXECUTE PROCEDURE pca_courier.fn_contador_manifiesto_consignados();

--Controla el conteo de descargos en la tabla pca_courier.manifiesto_consignados
CREATE OR REPLACE FUNCTION pca_courier.fn_contador_retornos_manifiesto() RETURNS trigger AS
$$
BEGIN
	IF(TG_OP='UPDATE')THEN
		IF(OLD.tipo_descargo_id ISNULL AND NEW.tipo_descargo_id NOTNULL)THEN
			UPDATE pca_courier.manifiestos SET
				retornos=retornos+1
			WHERE
				manifiesto_id=NEW.manifiesto_id;
		ELSIF(OLD.tipo_descargo_id NOTNULL AND NEW.tipo_descargo_id ISNULL)THEN
			UPDATE pca_courier.manifiestos SET
				retornos=retornos-1
			WHERE
				manifiesto_id=NEW.manifiesto_id;
		END IF;
	ELSIF(TG_OP='DELETE')THEN
		IF(OLD.tipo_descargo_id NOTNULL)THEN
			UPDATE pca_courier.manifiestos SET
				retornos=retornos-1
			WHERE
				manifiesto_id=OLD.manifiesto_id;
		END IF;
	END IF;
	RETURN NULL;
END;
$$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tri_contador_retornos_manifiesto ON pca_courier.manifiesto_consignados;
CREATE TRIGGER tri_contador_retornos_manifiesto AFTER UPDATE OR DELETE ON pca_courier.manifiesto_consignados
FOR EACH ROW
EXECUTE PROCEDURE pca_courier.fn_contador_retornos_manifiesto();

-------------------------------------------------------------------------------------------------------
--------------------------------------------Vistas-----------------------------------------------------
-------------------------------------------------------------------------------------------------------

CREATE OR REPLACE VIEW pca_courier.vw_consignados_manifiesto AS
SELECT 
	c.consignado_id,
	c.sesion_id,
	c.usuario_id,
	c.correlativo_interno,
	c.correlativo_consignado,
	c.orden_servicio_id,
	c.serie_orden_servicio,
	c.numero_orden_servicio,
	c.strserienumero_orden_servicio,
	c.cliente_id,
	c.cliente,
	c.fecha_hora_recojo,
	c.tipo_servicio_id,
	c.tipo_servicio,
	c.dias_minimo,
	c.dias_maximo,
	c.remitente,
	c.orden_servicio_detalle_id,
	c.detalle,
	c.medida,
	c.peso,
	c.tipo_envio,
	c.pais_id,
	c.ubigeo_id,
	c.strubigeo,
	c.doc_identidad_id,
	c.num_doc_identidad,
	c.nombre,
	c.direccion,
	c.referencia,
	c.empresa,
	c.cargo,
	c.telefono,
	c.email,
	c.grupo_consignado_id,
	c.grupo_consignado,
	c.fecha_hora_sistema,
	c.manifiesto_id,
	c.estado_reparto_id,
	e.nombre AS estado_reparto,
	c.numero_manifiestos,
	c.contador_observaciones,
	m.fecha_hora_despacho,
	mc.fecha_hora_regreso,
	CASE WHEN td.descargo ISNULL THEN 'S/D'
		ELSE  td.descargo
	END AS tipo_descargo,
	CASE WHEN td.nombre ISNULL THEN 'S/D ('|| e.nombre||')'
		ELSE  td.nombre
	END AS descargo,
	mc.observaciones,
	mc.sesion_id AS sesion_id_manifiesto,
	mc.sesion_id_descargo,
	c.cambio
FROM
	pca_courier.vw_consignados c
INNER JOIN
	pca_courier.estado_reparto e
ON
	(c.estado_reparto_id=e.estado_reparto_id)
LEFT JOIN
	pca_courier.manifiestos m
ON
	(c.manifiesto_id=m.manifiesto_id)
LEFT JOIN
	pca_courier.manifiesto_consignados mc
ON
	(c.manifiesto_id=mc.manifiesto_id AND
	 c.consignado_id=mc.consignado_id)
LEFT JOIN
	pca_courier.vw_tipo_descargo td
ON
	(mc.tipo_descargo_id=td.tipo_descargo_id);

CREATE OR REPLACE VIEW pca_courier.vw_manifiesto_consignados AS
SELECT
	mc.consignado_id,
	c.sesion_id,
	c.usuario_id,
	c.correlativo_interno,
	c.correlativo_consignado,
	c.orden_servicio_id,
	c.serie_orden_servicio,
	c.numero_orden_servicio,
	c.strserienumero_orden_servicio,
	c.cliente_id,
	c.cliente,
	c.fecha_hora_recojo,
	c.tipo_servicio_id,
	c.tipo_servicio,
	c.dias_minimo,
	c.dias_maximo,
	c.remitente,
	c.orden_servicio_detalle_id,
	c.detalle,
	c.medida,
	c.peso,
	c.tipo_envio,
	c.pais_id,
	c.ubigeo_id,
	c.strubigeo,
	c.doc_identidad_id,
	c.num_doc_identidad,
	c.nombre,
	c.direccion,
	c.referencia,
	c.empresa,
	c.cargo,
	c.telefono,
	c.email,
	c.grupo_consignado_id,
	c.grupo_consignado,
	c.fecha_hora_sistema,
	mc.manifiesto_id,
	c.estado_reparto_id,
	e.nombre AS estado_reparto,
	c.numero_manifiestos,
	c.contador_observaciones,
	m.fecha_hora_despacho,
	mc.fecha_hora_regreso,
	CASE WHEN td.descargo ISNULL THEN 'S/D'
		ELSE  td.descargo
	END AS tipo_descargo,
	CASE WHEN td.nombre ISNULL THEN 'S/D'
		ELSE  td.nombre
	END AS descargo,
	mc.observaciones,
	mc.sesion_id AS sesion_id_manifiesto,
	mc.sesion_id_descargo,
	c.cambio
FROM
	pca_courier.manifiesto_consignados mc
INNER JOIN
	pca_courier.vw_consignados c
ON
	(mc.consignado_id=c.consignado_id)
INNER JOIN
	pca_courier.estado_reparto e
ON
	(c.estado_reparto_id=e.estado_reparto_id)
INNER JOIN
	pca_courier.manifiestos m
ON
	(mc.manifiesto_id=m.manifiesto_id)
LEFT JOIN
	pca_courier.vw_tipo_descargo td
ON
	(mc.tipo_descargo_id=td.tipo_descargo_id);

CREATE OR REPLACE VIEW pca_courier.vw_estado_consignados_manifiesto AS
SELECT 
	manifiesto_id,
	CASE WHEN tipo_descargo_id ISNULL THEN 0::integer
		ELSE  1::integer
	END AS "estado_descargo"
FROM 
	pca_courier.manifiesto_consignados;
-------------------------------------------------------------------------------------------------------
-----------------------------Funciones pca_courier.manifiesto_consignados------------------------------
-------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_courier.fn_add_manifiesto_consignado(bigint,--manifiesto_id $1
								    bigint,--consignado_id $2
								    bigint --sesion_id $3
								    ) RETURNS void AS
$$
DECLARE
	_estado_manifiesto_id pca_courier.manifiestos.estado_manifiesto_id%TYPE;
	row_consignado pca_courier.consignados%ROWTYPE;
	_estado_orden_servicio pca_courier.orden_servicio.estado_orden_servicio_id%TYPE;
	_valestadoconsignado boolean;
BEGIN
	SELECT INTO 
		_estado_manifiesto_id estado_manifiesto_id 
	FROM 
		pca_courier.manifiestos
	WHERE
		manifiesto_id=$1;

	_valestadoconsignado := pca_courier.fn_get_config('ValEstadoConsignadoForAddManifiestoConsignado');
	
	--verificamos que solo se permitan ingresar consignados a manifiestos con estado = REGISTRADO
	IF (_estado_manifiesto_id='00')THEN
		
		SELECT INTO
			row_consignado *
		FROM
			pca_courier.consignados
		WHERE
			consignado_id=$2;
		IF(FOUND)THEN
			IF(row_consignado.manifiesto_id NOTNULL) THEN
				RAISE EXCEPTION 'El consignado ya pertenece al manifiesto %, Estacion destino : %',
						pca_courier.fn_get_strserienumero_manifiesto(row_consignado.manifiesto_id),
						pca_courier.fn_get_estacion_manifiesto(row_consignado.manifiesto_id);
			ELSE
				IF(row_consignado.estado_reparto_id <> '02' AND _valestadoconsignado)THEN
					RAISE EXCEPTION 'Estado consignado = % ,no se puede asignar al manifiesto',pca_courier.fn_get_nombre_estado_reparto(row_consignado.estado_reparto_id);
				END IF;

				INSERT INTO pca_courier.manifiesto_consignados
					(manifiesto_id,
					consignado_id,
					sesion_id)
				VALUES
					($1,$2,$3);
					
				IF(row_consignado.estado_reparto_id <> '02' AND NOT _valestadoconsignado)THEN
					--asignar automaticamente a Clasificacion
					UPDATE 
						pca_courier.consignados
					SET
						estado_reparto_id='02'
					WHERE
						consignado_id=$2;
				END IF;
			END IF;
		ELSE
			RAISE EXCEPTION 'No existe consignado con ID=%',$2;
		END IF;
	ELSE
		RAISE EXCEPTION 'No se puede modificar manifiesto estado=%',pca_courier.fn_get_nombre_estado_manifiesto(_estado_manifiesto_id);
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_del_manifiesto_consignado(bigint,--manifiesto_id $1
								    bigint --consignado_id $2
								    ) RETURNS void AS
$$
DECLARE
	_estado_manifiesto_id pca_courier.manifiestos.estado_manifiesto_id%TYPE;
BEGIN
	SELECT INTO 
		_estado_manifiesto_id estado_manifiesto_id 
	FROM 
		pca_courier.manifiestos
	WHERE
		manifiesto_id=$1;

	IF (_estado_manifiesto_id='00')THEN
		UPDATE	pca_courier.consignados SET
			manifiesto_id=NULL
		WHERE
			manifiesto_id=$1 AND
			consignado_id=$2;
			
		DELETE FROM 
			pca_courier.manifiesto_consignados
		WHERE
			manifiesto_id=$1 AND
			consignado_id=$2;
	ELSE
		RAISE EXCEPTION 'No se puede modificar manifiesto verifique ESTADO(IDESTADO=%)',_estado_manifiesto_id;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_get_manifiesto_consignados(bigint,--manifiesto_id $1
								     bigint,--consignado_id $2
								     integer --zona horaria existente en la tabla pca_tablas.zonas $3
								     )RETURNS pca_courier.vw_manifiesto_consignados AS
$$
DECLARE
	_row pca_courier.vw_manifiesto_consignados%ROWTYPE;
	_zona_horaria varchar; --la zona horaria a usar
BEGIN
	SELECT INTO _zona_horaria nombre FROM pca_tablas.zonas WHERE zona_id=$3;

	IF(FOUND)THEN

		execute  'SET TIMEZONE TO ''' || _zona_horaria || '''';

		SELECT
			consignado_id,
			sesion_id,
			usuario_id,
			correlativo_interno,
			correlativo_consignado,
			orden_servicio_id,
			serie_orden_servicio,
			numero_orden_servicio,
			strserienumero_orden_servicio,
			cliente_id,
			cliente,
			fecha_hora_recojo,
			tipo_servicio_id,
			tipo_servicio,
			dias_minimo,
			dias_maximo,
			remitente,
			orden_servicio_detalle_id,
			detalle,
			medida,
			peso,
			tipo_envio,
			pais_id,
			ubigeo_id,
			strubigeo,
			doc_identidad_id,
			num_doc_identidad,
			nombre,
			direccion,
			referencia,
			empresa,
			cargo,
			telefono,
			email,
			grupo_consignado_id,
			grupo_consignado,
			fecha_hora_sistema,
			manifiesto_id,
			estado_reparto_id,
			estado_reparto,
			numero_manifiestos,
			contador_observaciones,
			fecha_hora_despacho,
			fecha_hora_regreso,
			tipo_descargo,
			descargo,
			observaciones,
			sesion_id_manifiesto,
			sesion_id_descargo,
			cambio
		INTO
			_row
		FROM
			pca_courier.vw_manifiesto_consignados
		WHERE
			manifiesto_id = $1 AND
			consignado_id = $2;

		RETURN _row;
	ELSE
		RAISE EXCEPTION 'No existe zona horaria con id %',$3;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_get_list_consignado(integer,--start $1
							      integer, --limit $2
							      bigint --orden_servicio_id $3
							      )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			consignado_id,
			sesion_id,
			usuario_id,
			correlativo_interno,
			correlativo_consignado,
			orden_servicio_id,
			serie_orden_servicio,
			numero_orden_servicio,
			strserienumero_orden_servicio,
			cliente_id,
			cliente,
			fecha_hora_recojo,
			tipo_servicio_id,
			tipo_servicio,
			dias_minimo,
			dias_maximo,
			remitente,
			orden_servicio_detalle_id,
			detalle,
			medida,
			peso,
			tipo_envio,
			pais_id,
			ubigeo_id,
			strubigeo,
			doc_identidad_id,
			num_doc_identidad,
			nombre,
			direccion,
			referencia,
			empresa,
			cargo,
			telefono,
			email,
			grupo_consignado_id,
			grupo_consignado,
			fecha_hora_sistema,
			manifiesto_id,
			estado_reparto_id,
			estado_reparto,
			numero_manifiestos,
			contador_observaciones,
			fecha_hora_despacho,
			fecha_hora_regreso,
			tipo_descargo,
			descargo,
			observaciones,
			sesion_id_manifiesto,
			sesion_id_descargo,
			cambio
		FROM
			pca_courier.vw_consignados_manifiesto
		WHERE
			orden_servicio_id = $3 AND
			cambio <> 'E'
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT 
			numero_consignados 
		FROM 
			pca_courier.orden_servicio
		WHERE
			orden_servicio_id = $3;
	RETURN NEXT cursor_totalrows;	
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_get_list_consignado(integer,--start $1
							      integer, --limit $2
							      bigint,--orden_servicio_id $3
							      varchar[]--filtros $4
							      )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	sqlfiltro := 
		'SELECT
			consignado_id,
			sesion_id,
			usuario_id,
			correlativo_interno,
			correlativo_consignado,
			orden_servicio_id,
			serie_orden_servicio,
			numero_orden_servicio,
			strserienumero_orden_servicio,
			cliente_id,
			cliente,
			fecha_hora_recojo,
			tipo_servicio_id,
			tipo_servicio,
			dias_minimo,
			dias_maximo,
			remitente,
			orden_servicio_detalle_id,
			detalle,
			medida,
			peso,
			tipo_envio,
			pais_id,
			ubigeo_id,
			strubigeo,
			doc_identidad_id,
			num_doc_identidad,
			nombre,
			direccion,
			referencia,
			empresa,
			cargo,
			telefono,
			email,
			grupo_consignado_id,
			grupo_consignado,
			fecha_hora_sistema,
			manifiesto_id,
			estado_reparto_id,
			estado_reparto,
			numero_manifiestos,
			contador_observaciones,
			fecha_hora_despacho,
			fecha_hora_regreso,
			tipo_descargo,
			descargo,
			observaciones,
			sesion_id_manifiesto,
			sesion_id_descargo,
			cambio
		FROM
			pca_courier.vw_consignados_manifiesto
		WHERE orden_servicio_id = '|| $3 ||' AND cambio <> ''E'' AND '|| 
			pca_global.fn_get_strfiltro($3)|| 
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1 ;
			
	sqlcount := 
		'SELECT
			count(orden_servicio_id)
		FROM
			pca_courier.vw_consignados_manifiesto
		WHERE orden_servicio_id = '|| $3 ||' AND cambio <> ''E'' AND '|| 
			pca_global.fn_get_strfiltro($3);
	
	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;	
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_existe_manifiesto_consignado(bigint,--manifiesto_id $1
								       bigint --consignado_id $2
								       ) RETURNS boolean AS
$$
DECLARE
	_row pca_courier.manifiesto_consignados%ROWTYPE;
BEGIN
	SELECT INTO 
		_row
		*
	FROM
		pca_courier.manifiesto_consignados
	WHERE
		manifiesto_id=$1 AND
		consignado_id=$2;

	IF(FOUND)THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_add_descargo_consignados_manifiesto(bigint, --manifiesto_id $1
									      bigint, --consignado_id $2
									      varchar, --tipo_descargo_id $3
									      text, --observaciones $4
									      bigint --sesion_id_descargo $5
									      ) RETURNS void AS
$$
DECLARE
	_estado_manifiesto_id pca_courier.manifiestos.estado_manifiesto_id%TYPE;
	_estado_orden_servicio_id pca_courier.orden_servicio.estado_orden_servicio_id%TYPE;
	_row pca_courier.consignados%ROWTYPE;
	_row_manifiesto_consignado pca_courier.manifiesto_consignados%ROWTYPE;
	_permitirmanifiestonulo boolean;
BEGIN
	--recogemos informacion del consignado
	SELECT INTO
		_row
		*
	FROM
		pca_courier.consignados
	WHERE
		consignado_id=$2;
			
	IF($1=0)THEN--el consignado no esta asignado a un manifiesto
		_permitirmanifiestonulo := pca_courier.fn_get_config('PermitirManifiestoNuloForDescargo');

		IF(_permitirmanifiestonulo)THEN
			IF(_row.manifiesto_id ISNULL)THEN
				INSERT INTO pca_courier.manifiesto_consignados
					(manifiesto_id,
					consignado_id,
					sesion_id)
				VALUES
					($1,$2,$5);
			ELSE
				IF(_row.manifiesto_id<>0)THEN
					RAISE EXCEPTION 'El consignado pertenece al manifiesto Nº %, y se esta intentando descargarlo con manifiesto 00-000000',pca_courier.fn_get_strperiodonumero_manifiesto(_row.manifiesto_id);
				END IF;
			END IF;

			SELECT INTO
				_row_manifiesto_consignado
				*
			FROM
				pca_courier.manifiesto_consignados
			WHERE
				manifiesto_id=$1 AND
				consignado_id=$2;

			IF(_row_manifiesto_consignado.tipo_descargo_id ISNULL OR _row_manifiesto_consignado.tipo_descargo_id <> $3)THEN
				UPDATE pca_courier.manifiesto_consignados SET
					fecha_hora_regreso=current_timestamp,
					tipo_descargo_id=$3,
					observaciones=$4,
					sesion_id_descargo=$5
				WHERE
					manifiesto_id=$1 AND
					consignado_id=$2;

				UPDATE pca_courier.consignados SET
					estado_reparto_id='04'
				WHERE
					consignado_id=$2;
			ELSE
				RAISE EXCEPTION 'No esta permitido asignar el mismo tipo de descargo';
			END IF;
		ELSE
			RAISE EXCEPTION 'No se permiten registrar descargo para consignados sin manifiesto';
		END IF;
	ELSE
		IF(FOUND)THEN
			IF(_row.manifiesto_id=$1)THEN
				_estado_manifiesto_id := pca_courier.fn_get_manifiesto_estado($1);
				IF(_estado_manifiesto_id='01')THEN
					_estado_orden_servicio_id := pca_courier.fn_get_orden_servicio_estado(_row.orden_servicio_id);
					IF(_estado_orden_servicio_id='01')THEN			
						IF(_row.estado_reparto_id='03' OR _row.estado_reparto_id='04')THEN
							SELECT INTO
								_row_manifiesto_consignado
								*
							FROM
								pca_courier.manifiesto_consignados
							WHERE
								manifiesto_id=$1 AND
								consignado_id=$2;

							IF(_row_manifiesto_consignado.tipo_descargo_id ISNULL OR _row_manifiesto_consignado.tipo_descargo_id <> $3)THEN
								UPDATE pca_courier.manifiesto_consignados SET
									fecha_hora_regreso=current_timestamp,
									tipo_descargo_id=$3,
									observaciones=$4,
									sesion_id_descargo=$5
								WHERE
									manifiesto_id=$1 AND
									consignado_id=$2;
						
								UPDATE pca_courier.consignados SET
									estado_reparto_id='04'
								WHERE
									consignado_id=$2;
							ELSE
								RAISE EXCEPTION 'No esta permitido asignar el mismo tipo de descargo';
							END IF;
						ELSE
							RAISE EXCEPTION 'Solo se pueden registrar descargos para consignados con "estado=TRANSITO" o "estado=FINALIZADO", estado actual del consignado=%',pca_courier.fn_get_nombre_estado_reparto(_row.estado_reparto_id);
						END IF;
					ELSE
						RAISE EXCEPTION 'No se puede registrar descargo para el consignado ID=% ,su orden de servicio no esta en OPERACIONES, estado actual de la orden de servicio=%',$2,pca_courier.fn_get_nombre_estado_orden_servicio(_estado_orden_servicio_id);
					END IF;
				ELSE
					RAISE EXCEPTION 'No se puede registrar descargo para el consignado ID=% ,su manifiesto no esta en TRANSITO,estado actual del manifiesto = %',$2,pca_courier.fn_get_nombre_estado_manifiesto(_estado_manifiesto_id);
				END IF;
			ELSE
				RAISE EXCEPTION 'El consignado con ID=% no pertenece al manifiesto N° %',$2,pca_courier.fn_get_strserienumero_manifiesto($1);
			END IF;
		ELSE
			RAISE EXCEPTION 'No existe consignado con ID=%',$2;
		END IF;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_courier.fn_get_resumen_consignados_manifiesto(bigint --manifiesto_id $1
									     )RETURNS SETOF RECORD AS
$$
DECLARE
	_resumen RECORD;
	_resul RECORD;
	count_sin_descargo bigint;
	count_finalizado bigint;
BEGIN
	count_sin_descargo := 0;
	count_finalizado := 0;

	FOR _resumen IN
		SELECT
			estado_descargo,count(estado_descargo) as total
		FROM 
			pca_courier.vw_estado_consignados_manifiesto
		WHERE
			manifiesto_id=$1
		GROUP BY
			estado_descargo
	LOOP
		IF(_resumen.estado_descargo=0)THEN
			count_sin_descargo := _resumen.total;
		ELSIF(_resumen.estado_descargo=1)THEN
			count_finalizado := _resumen.total;
		END IF;
	END LOOP;

	FOR _resul IN
		SELECT
			count_sin_descargo,
			count_finalizado
	LOOP
		RETURN NEXT _resul;
	END LOOP;
END;
$$
LANGUAGE plpgsql;